package com.tongcao.cn.algorithm.designMoel.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author:tongcao
 * @Date:2019/4/10 10:40
 * Description: JDK动态代理
 *
 * 　动态代理是指动态的在内存中构建代理对象（需要我们制定要代理的目标对象实现的接口类型），即利用JDK的API生成指定接口的对象，也称之为JDK代理或者接口代理
 */
public class JdkProxy implements InvocationHandler {

    /**
     * 这里是我们需要代理的对象
     */
    private Object object;

    public JdkProxy(Object targetObj) {
        this.object = targetObj;
    }

    /**
     * 将目标对象传入进行代理
     *
     * @param targetObj
     * @return
     */
    public Object newProxy(Object targetObj) {
        this.object = targetObj;
        return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(), targetObj.getClass().getInterfaces(), this);
    }




    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //　　在代理真实对象前我们可以添加一些自己的操作
        System.out.println("before rent house");

        checkLogic();
        System.out.println("method:" + method);

        //    当代理对象调用真实对象的方法时，其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        Object ret = method.invoke(object, args);
        //　　在代理真实对象后我们也可以添加一些自己的操作
        System.out.println("after rent house");

        return ret;
    }


    /**
     * 模拟检查权限的例子
     */
    private void checkLogic() {
        System.out.println("======检查权限checkPopedom()======");
    }
}